Spring Cloud Bus 笔记补充

作者: 李多多 日期: 2020-08-14
Spring Cloud
Spring Cloud Bus 笔记补充

Spring Cloud Bus 通过轻量级消息代理连接各个微服务,可用广播配置文件来更改/或管理服务监控。

首先安装 RabbitMQ,Docker 中 RabbitMQ 安装命令:

docker run -d --hostname my-rabbit --name some-rabbit -P 15672:15672 5672:5672 rabbitmq:3-management

详细安装步骤可参考 Docker一键安装RabbitMQ 这篇文章。

1. 实现配置文件的动态刷新(全部刷新)。

在上篇文章当我们的配置文件发生变化时,我们需要挨个的向 config-client 发送 include refresh 这个请求,然才能实现 config-client 配置文件的动态刷新。显然比较麻烦。

结合 Spring Cloud Bus 之后,当我们的配置文件发生变化时, 我们可以只向 config-server 发送一个更新请求,然后 config-server 把消息发送给 Spring Cloud Bus ,Spring Cloud Bus 收到消息后把消息转发到 RabbitMQ ,RabbitMQ 就可以通知 config-client ,config-client 收到消息后就会自动更新。(总之就是开发者只需给 config-server 发送一次消息就可以了,剩下 config-client 都会自动刷新。)

RabbitMQ安装完成后,结合上篇文章在 config-server 和 config-client 分别添加如下依赖:

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>

同时 config-server 将提供刷新接口,所以 config-server 还需添加如下依赖:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

然后,给两个分别配置,使之都能连接到 RabbitMQ 上。

spring.rabbitmq.host=192.168.1.132
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest

在 config-server 中,添加开启 bus-refresh 端点:

management.endpoints.web.exposure.include=bus-refresh

由于给 config-server 中的所有接口都添加了保护,所以刷新接口都无法直接访问,这时可通过修改 Security 配置,对端点的权限作出修改:

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.and()
.httpBasic()
.and()
.csrf().disable();
}

}

在这段配置中,开启了 HttpBasic 登录,这样在刷新请求时,就可以直接通过 HttpBasic 配置认证信息了。
最后分别启动 Eureka、 config-server 和 config-client ,访问:http://localhost:8082/hello 如下:

在这里插入图片描述
然后修改配置信息提交到 GitHub (此处将test123改为 test),刷新 config-client 接口,查看是否有变化 (此时没变化)。

然后用 postman 测试发送 POST 请求: http://localhost:8081/actuator/bus-refresh ,请求结果是空白则成功。如下图:

在这里插入图片描述

这个 post 是针对 config-server 的,config-server 会把这个刷新的指令传到 rabbitMQ,然后 rabbitmq 再把指令传给各个 client。然后继续访问: http://localhost:8082/hello 如下: 发现结果已经改变。(此处只要在 client 端配置了 rabbitmq,就会自动修改)。

在这里插入图片描述

2. 逐个刷新

如果更新完配置文件之后,不希望每一个微服务都去刷新配置文件,那么可以通过如下配置解决问题。
首先,给每个 config-client 配置文件添加一个 instance-id:

eureka.instance.instance-id=${spring.application.name}:${server.port}

然后,对 config-client 进行打包。

打包完成后,在IDEA 的Terminal 框通过如下命令启动两个 config-client 实例:

java -jar config-client-0.0.1-SNAPSHOT.jar --server.port=8082
java -jar config-client-0.0.1-SNAPSHOT.jar --server.port=8083

启动成功后,在浏览器分别访问8082端口和8083端口的,访问结果相同。如下:
在这里插入图片描述
在这里插入图片描述
接下来修改本地文件(将 test 改为 test234),并提交至 GitHub,如下:
在这里插入图片描述

1. 测试批量全部刷新

提交后,我们继续 post 请求 config-server ,访问 http://localhost:8081/actuator/bus-refresh 如下:

在这里插入图片描述
请求成功后,继续访问刚才那两个接口,都已经发生了改变。如下:

在这里插入图片描述
在这里插入图片描述

2. 测试逐个刷新

继续修改本地文件(将 test234 改为 test888),并提交至 GitHub,如下:

在这里插入图片描述
提交成功后可通过如下方式只刷新某一个微服务,例如只刷新 8082 端口的服务。
client1:8082 表示是服务instance-id。

http://localhost:8081/actuator/bus-refresh/client1:8082

在这里插入图片描述
此时再访问原来那两个接口,结果如下,只有 8082 端口发生了变化,8083 没有改变。

在这里插入图片描述
在这里插入图片描述

代码地址:https://github.com/astronger/springcloud-simple-samples